// import com->alibaba->druid->sql->ast->expr->SQLIntegerExpr;
// import com->alibaba->druid->sql->visitor->SQLASTVisitor*;

// import java->util->ArrayList;
// import java->util->HashMap;
// import java->util->std::list;

/*
 * Created by wenshao on 16/9/25->
 */
#pragma once

#include <string>
#include <list>

#include "SQLObjectImpl.h"
#include "SQLReplaceable.h"

class SQLLimit
    : virtual public SQLObjectImpl,
      virtual public SQLReplaceable//,
      // virtual public std::enable_shared_from_this<SQLLimit>
{
public:
  SQLExpr_ptr rowCount;
  SQLExpr_ptr offset;
  SQLExpr_list_ptr by;

  SQLLimit();

  SQLLimit(int rowCount);

  SQLLimit(SQLExpr_ptr rowCount);

  SQLLimit(SQLExpr_ptr offset, SQLExpr_ptr rowCount);
  SHAREDOBJECT(SQLLimit)   ;
  SQLExpr_ptr getRowCount();

  void setRowCount(SQLExpr_ptr rowCount);

  void setRowCount(int rowCount);

  SQLExpr_ptr getOffset();

  void setOffset(int offset);

  void setOffset(SQLExpr_ptr offset);

  void merge(SQLLimit_ptr other);

  void accept0(SQLASTVisitor_ptr visitor) override;

  // SQLLimit *clone();
  virtual SQLObject_ptr clone();
  void addBy(SQLExpr_ptr item);

  SQLExpr_list_ptr getBy();

  BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target);

  bool equals(Object_ptr o);

  int hashCode();
};
